package cz.uhk.ppro.controllers.admin;

import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import cz.uhk.ppro.entities.Stitek;
import cz.uhk.ppro.form.Login;
import cz.uhk.ppro.form.StitekForm;
import cz.uhk.ppro.services.LoginChecker;
import cz.uhk.ppro.services.StitekDbService;
import cz.uhk.ppro.validator.StitekValidator;

@Controller
@SessionAttributes({"stitky", "nazev"})
public class AdminStitekController {
	Login login;
	StitekDbService stitekService;
	LoginChecker loginChecker;
	StitekForm stitekForm;
	StitekValidator stitekValidator;
	
	@ModelAttribute("login")
	public Login getLogin() {
		return new Login();
	}
	
	@Autowired
	public void setStitekValidator(StitekValidator stitVal) {
		this.stitekValidator = stitVal;
	}
	
	@Autowired
	public void setStitekService (StitekDbService stitekService){
		this.stitekService = stitekService;
	}
	
	@Autowired
	public void setLoginChecker (LoginChecker loginChecker){
		this.loginChecker = loginChecker;
	}
	
	@ModelAttribute("stitekForm")
	public StitekForm getStitekForm() {
		return new StitekForm();
	}
	
	@RequestMapping("/adminStitek")
	public String stitky(Locale locale, ModelMap model, HttpSession session, @ModelAttribute("stitekForm")
    StitekForm stitekForm) {
		if (loginChecker.checkLogin(session, "Admin")){
			List<Stitek> stitkydb = stitekService.vypis();		
			stitekForm = new StitekForm();
			model.addAttribute("stitky", stitkydb);
			model.addAttribute("stitekForm", stitekForm);
			return "adminStitek";
		}else {
			return "accessDenied";
		}
	}
	
	@RequestMapping(value="/adminPridejStitek", method = RequestMethod.POST)
	public String add(@ModelAttribute("stitekForm") StitekForm stitekForm, BindingResult result,
			Locale locale, ModelMap model, HttpSession session) {
		stitekValidator.validate(stitekForm, result);
		if (result.hasErrors()) {
			 return "adminStitek";
		 } else {
		if (loginChecker.checkLogin(session, "Admin")){
			stitekService.pridej(stitekForm.getNazevStitku());
			stitekForm = new StitekForm();
			return "redirect:/adminStitek";
		}else {
			return "accessDenied";
		}}
	}
	
	@RequestMapping(value="/adminSmazStitek")
	public String del(Locale locale, ModelMap model, HttpSession session,@ModelAttribute("stitekForm")
    StitekForm stitekForm,int id) {
				
		if (loginChecker.checkLogin(session, "Admin")){
			Stitek st = stitekService.vrat(id)	;
			stitekService.smaz(st);
			return "redirect:/adminStitek";
		}else {
			return "accessDenied";
		}
	}
	@RequestMapping(value="/adminUpravStitek", method = RequestMethod.POST)
	public String edit(@ModelAttribute("stitekForm") StitekForm stitekForm, BindingResult result,
			Locale locale, ModelMap model, HttpSession session) {
		stitekValidator.validate(stitekForm, result);
		if (result.hasErrors()) {
			 return "adminUpravStitek";
		 } else {
		if (loginChecker.checkLogin(session, "Admin")){
			stitekService.uprav(stitekService.vrat(stitekForm.getId()), stitekForm.getNazevStitku());
			stitekForm = new StitekForm();
			return "redirect:/adminStitek";
		}else {
			return "accessDenied";
		}}
	}
	@RequestMapping(value="/adminUpravStitek", method = RequestMethod.GET)
	public String editGet(Locale locale, ModelMap model, HttpSession session,@ModelAttribute("stitekForm")
    StitekForm stitekForm,int id) {
		if (loginChecker.checkLogin(session, "Admin")){
			Stitek stitek = stitekService.vrat(id);
			model.addAttribute("nazev", stitek);
			return "adminUpravStitek";
		}else {
			return "accessDenied";
		}
	}
}
